package com.ld.common.plugin;

import java.io.File;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.ld.shieldsb.common.composition.util.ConvertUtil;
import com.ld.shieldsb.common.core.collections.ListUtils;
import com.ld.shieldsb.common.core.io.FileUtils;
import com.ld.shieldsb.common.core.model.Result;
import com.ld.shieldsb.common.core.util.ResultUtil;
import com.ld.shieldsb.common.web.util.ConfigurationFileUtil;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class PluginUtil {

    public static final String PREFERENCE_FILE_PREFIX = "plugin"; // 配置信息文件名称

    private static Map<String, String> preferenceMap;

    @SuppressWarnings("unchecked")
    public static Map<String, String> getPreferenceMap() {
        if (preferenceMap != null) {
            return preferenceMap;
        }
        // 不存在则查询文件
        File file = getPreferenceFile();
        if (file != null) {
            try {
                String content = FileUtils.readFileToString(file, "UTF-8");
                // 转换字符串
                Map<String, String> model = ConvertUtil.jsonStr2Obj(content, Map.class);
                preferenceMap = model;
                return model;
            } catch (Exception e) {
                log.error("", e);
            }
        }
        return null;
    }

    /**
     * 获取配置如果没有则初始化
     * 
     * @Title getPreferenceMapOrInit
     * @author 吕凯
     * @date 2019年12月9日 下午4:20:12
     * @param plugins
     * @return Map<String,String>
     */
    public static Map<String, String> getPreferenceMapOrInit(List<Plugin> plugins) {
        Map<String, String> map = getPreferenceMap();
        if (map == null) {
            map = new LinkedHashMap<>();
            Map<String, String> mapData = new LinkedHashMap<>();
            if (ListUtils.isNotEmpty(plugins)) {
                plugins.forEach(plugin -> {
                    mapData.put(plugin.getPluginInfo().getClassName(), "true");
                });
                preferenceMap = mapData;
            }
            map.putAll(mapData);
        }
        return map;
    }

    /**
     * 获取个人偏好文件
     * 
     * @Title getPreferenceFile
     * @author 吕凯
     * @date 2018年12月21日 下午2:17:32
     * @return File
     */
    public static File getPreferenceFile() {
        File file = ConfigurationFileUtil.getConfigFile(PREFERENCE_FILE_PREFIX);
        if (!file.exists()) {
            return null;
        }
        return file;
    }

    /**
     * 保存配置信息
     * 
     * @Title savePreferences
     * @author 吕凯
     * @date 2018年12月21日 下午1:16:21
     * @param model
     * @return Result
     */
    public static Result savePreferences1(Map<String, String> model) {
        preferenceMap = null;
        String preference = ConvertUtil.obj2JsonStr(model);
        try {
            File file = ConfigurationFileUtil.getConfigFile(PREFERENCE_FILE_PREFIX);
            FileUtils.write(file, preference, "UTF-8");
        } catch (IOException e) {
            log.error("", e);
            return ResultUtil.error("保存配置失败！" + e.getMessage());
        }
        return ResultUtil.success("保存配置成功！");
    }

    /**
     * 
     * 保存单个配置信息
     * 
     * @Title savePreference
     * @author 吕凯
     * @date 2019年12月9日 下午4:30:43
     * @param key
     * @param value
     * @return Result
     */
    public static Result savePreferences(String key, String value) {
        preferenceMap = null;
        Map<String, String> model = getPreferenceMap();
        if (model == null) {
            model = new LinkedHashMap<>();
        }
        model.put(key, value);
        String preference = ConvertUtil.obj2JsonStr(model);
        try {
            File file = ConfigurationFileUtil.getConfigFile(PREFERENCE_FILE_PREFIX);
            FileUtils.write(file, preference, "UTF-8");
        } catch (IOException e) {
            log.error("", e);
            return ResultUtil.error("保存配置失败！" + e.getMessage());
        }
        return ResultUtil.success("保存配置成功！");
    }

}
